package demo1229.am;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
线程池概念:
现有问题:
1.线程是宝贵的内存资源,单个线程约占1MB,过多分配造成内存溢出.
2.频繁的创建和销毁线程会增加虚拟机回收频率,资源开销,造成程序性能下降.

线程池:
1.线程容器,可设定线程分配的数量上限.
2.将预先创建线程对象放入到线程池中,并重用线程池中的线程对象.
3.避免频繁的创建和销毁线程对象.

线程池原理:
把任务提交线程池,有线程池分配线程,运行任务,并在当前任务结束后复用线程.

常用的线程池接口和类(所在的包java.util.concurrent):
public class Executors (线程池工厂类):可以通过此类获取一个线程池.
获取线程池的方法:
1.public static ExecutorService newFixedThreadPool(int nThreads);
获取一个固定数量的线程的线程池.
nThreads:指定的线程个数.
2.public static ExecutorService newCachedThreadPool()
获取动态数量的线程池,如不够创建新的,没有上限.

ExecutorService接口中的方法:
1.Future<?> submit(Runnable task);
提交一个 Runnable 任务用于执行，并返回一个表示该任务的 Future对象
该 Future 的 get 方法在成功完成时将会返回 null。

2.void shutdown()
启动一次顺序关闭，执行以前提交的任务，但不接受新任务。

 */
public class Demo_02 {
    public static void main(String[] args) {

//        获取到一个线程池对象
        ExecutorService threadPool = Executors.newFixedThreadPool(3);

//      向线程池中提交
        threadPool.submit(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }
        });

        threadPool.submit(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }
        });

        threadPool.submit(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+i);
                }
            }
        });

        //关闭线程池
        threadPool.shutdown();



    }
}
